package br.ucb.tcc.swing;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Set;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import net.java.dev.designgridlayout.DesignGridLayout;
import thinlet.swing.border.LineBorder;
import thinlet.swing.container.ToolFooter;
import twitter4j.TwitterException;
import br.ucb.tcc.negocio.TwitterBean;
import br.ucb.tcc.persistencia.TwitterDAO;
import br.ucb.tcc.utils.StringUtil;

public class EnviarMensagemFrame extends AbstractPanel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private ToolFooter subPanelHeader;
	private JTextArea textArea;
	private JButton enviarTwitter;
	private JButton limparCampo;
	private JComboBox comboTags;
	private JComboBox comboNomes;
	private JPanel panelEnviar;

	public EnviarMensagemFrame() {
		super(new BorderLayout());
		URL imgsrc = Main.class.getResource("icon/twitter-banner.jpg");
		JPanel header = new JPanel(new BorderLayout());
		subPanelHeader = new ToolFooter();
		JLabel lbHeader = new JLabel("<html><body>" + "<table><tr><td>" + "<img width='650' height='100' src='"
				+ imgsrc + "'></img>" + "</td><td><h3>Enviar mensagem</h3></td></tr></table></body></html>");
		lbHeader.setBorder(new LineBorder(Color.lightGray, 0, 0, 0, 0, 0, 0, 0, 0));
		lbHeader.setBackground(new Color(0xdddddd));
		lbHeader.setOpaque(true);
		header.add(lbHeader, BorderLayout.CENTER);
		header.add(subPanelHeader, BorderLayout.SOUTH);
		JPanel panel = new JPanel();
		panel.setBorder(BorderFactory.createEmptyBorder());
		panel.setLayout(new BorderLayout());
		panel.add(header, BorderLayout.NORTH);
		panel.add(getPanelEnviarTweet(), BorderLayout.CENTER);
		add(panel, BorderLayout.NORTH);

	}

	public JPanel getPanelEnviarTweet() {
		if (panelEnviar == null) {
			panelEnviar = new JPanel();
			DesignGridLayout gridLayout = new DesignGridLayout(panelEnviar);
			gridLayout.row().grid(new JLabel("Twitter:")).add(getTextArea());
			gridLayout.row().grid(new JLabel("Filtos")).add(getComboTags()).add(getComboNomes());
			gridLayout.row().center().add(getEnviarTwitter()).add(getLimparCampo());
		}
		return panelEnviar;
	}

	/**
	 * @return the textArea
	 */
	public JTextArea getTextArea() {
		if (textArea == null) {
			textArea = new JTextArea(10, 10);
			textArea.setToolTipText("Até 140 caracteres!");
			JScrollPane barra = new JScrollPane(textArea); // Adiciona Scroll no
			// TextArea
			barra.setViewportView(textArea);
		}
		return textArea;
	}

	/**
	 * @return the enviarTwitter
	 */
	public JButton getEnviarTwitter() {
		if (enviarTwitter == null) {
			enviarTwitter = new JButton();
			enviarTwitter.setText("Enviar Tweet");
			enviarTwitter.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent arg0) {
					TwitterDAO dao = new TwitterDAO();
					HashMap<String, String> buscarRelacoes = dao.buscarRelacoes(getComboTags().getSelectedItem()
							.toString());
					StringBuilder perfisMencionados = new StringBuilder();
					if (getComboNomes().getSelectedItem() != null &&!getComboNomes().getSelectedItem().equals("")) {
						perfisMencionados.append("@" + getComboNomes().getSelectedItem().toString() + ",");
					}
					for (String key : buscarRelacoes.keySet()) {
						perfisMencionados.append("@" + key + "," + "@" + buscarRelacoes.get(key) + ",");
					}
					perfisMencionados.replace(perfisMencionados.lastIndexOf(","),
							perfisMencionados.lastIndexOf(",") + 1, " .");
					JTextArea textoArea = new JTextArea("Sua menção ficará da seguinte forma no Twitter:\n"
							+ perfisMencionados + getTextArea().getText() + "\nDeseja publicar?");
					textoArea.setColumns(50);
					textoArea.setRows(10);
					javax.swing.JScrollPane scrollPane = new javax.swing.JScrollPane(textoArea);

					int showConfirmDialog = JOptionPane.showConfirmDialog(null, scrollPane);
					if (showConfirmDialog == JOptionPane.OK_OPTION) {
						StringBuilder texto = new StringBuilder(perfisMencionados + " " + getTextArea().getText());
						if (verificarTextoTwitter(texto.toString())) {
							try {
								TwitterBean.sendMessage(texto.toString());
								JOptionPane.showMessageDialog(null, "Publicação feita com sucesso!");
							} catch (TwitterException e) {
								JOptionPane.showMessageDialog(null,
										"Erro ao tentar publicar modificação, favor executar novamente.");
							}
						} else {
							JOptionPane.showMessageDialog(null,
									"Tamanho não permitido. Valor máximo é de 140 caracteres!");
						}
					}
				}

				private boolean verificarTextoTwitter(String string) {
					if (!(string.length() < 140)) {
						return false;
					}
					return true;
				}
			});
		}
		return enviarTwitter;
	}

	/**
	 * @return the limparCampo
	 */
	public JButton getLimparCampo() {
		if (limparCampo == null) {
			limparCampo = new JButton();
			limparCampo.setText("Limpar");
			limparCampo.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent arg0) {
					getTextArea().setText("");
					getComboTags().setSelectedIndex(-1);
					getComboNomes().setSelectedIndex(-1);
				}
			});
		}
		return limparCampo;
	}

	/**
	 * @return the comboLocalizacao
	 */
	public JComboBox getComboTags() {
		if (comboTags == null) {
			comboTags = new JComboBox();
			TwitterDAO dao = new TwitterDAO();
			Set<String> tags = dao.buscarTagsPesquisadas();
			comboTags.addItem("");
			for (String string : tags) {
				comboTags.addItem(string);
			}
		}
		return comboTags;
	}

	/**
	 * @return the comboLocalizacao
	 */
	public JComboBox getComboNomes() {
		if (comboNomes == null) {
			comboNomes = new JComboBox();
			TwitterDAO dao = new TwitterDAO();
			List<String> nomes = dao.buscarPerfis();
			comboNomes.addItem("");
			for (String string : nomes) {
				comboNomes.addItem(string);
			}
		}
		return comboNomes;
	}
}
